package com.aididi.designpatter;

/**
 * @Auther: xuzexiang
 * @Date: 2018-10-26 0026 22:40
 * @Description:    工厂模式
 *   程序在接口和子类之间加入了一个过渡端，通过此过渡端可以动态取得实现了共同接口的子类实例化对象。
 *      简单工厂
 *
 *      使用场景： 1、日志记录器：记录可能记录到本地硬盘、系统事件、远程服务器等，用户可以选择记录日志到什么地方。
 *      2、数据库访问，当用户不知道最后系统采用哪一类数据库，以及数据库可能有变化时。
 *      3、设计一个连接服务器的框架，需要三个协议，"POP3"、"IMAP"、"HTTP"，可以把这三个作为产品类，共同实现一个接口。
 */
public class SimpleFactory{
    public static void main(String[] args) {
        // 定义接口对象
        Animal a = null;
        // 通过工厂获取实例
        a = Factorys.getInstance("Cat");
        // 判断对象是否为空
        if (a != null) {
            a.say(); // 调用方法
        }

    }
}

interface Animal { // 定义一个动物的接口
     void say(); // 说话方法
}
class Cat implements Animal { // 定义子类Cat
    @Override
    public void say() { // 覆写say()方法
        System.out.println("我是猫咪，喵呜！");
    }
}
class Dog implements Animal { // 定义子类Dog

    @Override
    public void say() { // 覆写say()方法
        System.out.println("我是小狗，汪汪！");
    }
}

/**
 *  定义工厂类
 */
class Factorys {
    public static Animal getInstance(String className) {
        // 定义接口对象
        Animal a = null;
        // 判断是哪个子类的标记
        if ("Cat".equalsIgnoreCase(className)) {
            // 通过Cat子类实例化接口
            a = new Cat();
        }
        // 判断是哪个子类的标记
        if ("Dog".equalsIgnoreCase(className)) {
            // 通过Dog子类实例化接口
            a = new Dog();
        }
        return a;
    }
}
